package org.example;

import com.alibaba.fastjson.JSON;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.*;
import com.deepoove.poi.data.style.BorderStyle;
import com.deepoove.poi.data.style.PictureStyle;
import com.deepoove.poi.plugin.markdown.MarkdownRenderData;
import com.deepoove.poi.plugin.markdown.MarkdownRenderPolicy;
import com.deepoove.poi.plugin.markdown.MarkdownStyle;
import org.apache.commons.io.FileUtils;
import org.ddr.poi.html.HtmlRenderPolicy;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 支持 HTML 渲染
 * 支持超链接文本生成
 */
public class TemplateDemo {
    public static void main(String[] args) throws IOException {
        fromTemplate();
    }

    static void PatentBuild() throws IOException {
        XWPFTemplate template = XWPFTemplate.compile("/media/sqb/d/word-demo/template/t1.docx").render(
                new HashMap<String, Object>() {{
                    put("title", "新能源");
                    put("linkTitle", Texts.of("website").link("http://deepoove.com").create());
                    put("qi", 3);
                    put("month", 8);
                    put("jishugoucheng", "近10年行业研究的前十大技术为新型密封、港口船舶。其中港口船舶技术占比20%，新型密封技术占比80%。");
                    put("jishugouchengpic", getPic());
                    put("table", getTable());
                    put("personList", getPersonList());
                }});
        template.writeAndClose(new FileOutputStream("/media/sqb/d/word-demo/templateOutput.docx"));
    }

    static void fromTemplate() throws IOException {

        String theHtmlKey = "key";
        String theMarkdownKey = "articleContent";
        String theMarkdownKey2 = "articleContent2";

        HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
        MarkdownRenderPolicy markdownRenderPolicy = new MarkdownRenderPolicy();

        Configure configure = Configure.builder()
                .bind(theHtmlKey, htmlRenderPolicy)
                .bind("name", htmlRenderPolicy)
                .bind(theMarkdownKey, markdownRenderPolicy)
                .bind(theMarkdownKey2, markdownRenderPolicy)
                .build();

        XWPFTemplate template = XWPFTemplate.compile("D:/word-demo/template/t1.docx", configure).render(
                new HashMap<String, Object>() {{
                    put("title", "新能源");
                    put("linkTitle", Texts.of("website").link("http://deepoove.com").create());
                    put("qi", 3);
                    put("month", 8);
                    put("jishugoucheng", "近10年行业研究的前十大技术为新型密封、港口船舶。其中港口船舶技术占比20%，新型密封技术占比80%。");
                    put("jishugouchengpic", getPic());
                    put("table", getTable());
                    put("personList", getPersonList());
                    put(theHtmlKey, "<p>Hello <b>world <br /> hello \\n alsdjfsladfasdf</b>! </p> A<sub>eff</sub> some <br/>");
                    put(theMarkdownKey, getMarkdownRenderData("截至2025年，北京市专利总申请量为3965678件，授权专利总数1993071件，申请人总量5012486件，发明人总量16599298件，高价值发明专利量852451件，每万人口高价值发明专利拥有量389.50件/万人，\n 产学研合作申请量(件)/占比130488/3.29%。\\n\\n"));
                    put(theMarkdownKey2, getMarkdownRenderData("| 行业应用场景               | 具体描述                                                                                     | 相关工具/方法                                                                                      |\n" +
                            "|---------------------------|------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|\n" +
                            "| 搜索引擎优化（SEO）        | 当关键词提取失败时，需重新输入词根或调整挖掘策略，确保覆盖长尾词和行业需求。                                 | 百度相关词搜索、TF-IDF算法、行业域名库校验（如生财工具中的关键词内容挖掘工具）                             |\n" +
                            "| 广告投放与营销分析         | 若未提取到有效关键词，需优化Prompt设计或结合业务需求重新标注，以提高ChatGPT等模型的提取准确率。               | ChatGPT Prompt优化工具（如coze、promptperfect）、BERT+CRF模型                                  |\n" +
                            "| 内容分析与摘要生成         | 从海量文本中提取关键词失败时，需调整TF-IDF参数或补充语料库，重新计算词频和覆盖率。                           | TF-IDF算法、LDA主题模型、TextRank（如生财工具中的关键词基于海量内容挖词工具）                           |\n" +
                            "| 短文本分类与聚类          | 对长尾词分词后未获得有效词根时，需自定义不可分割词库或排除无关词文件，重新进行词频统计。                      | 中文分词工具（如jieba）、自定义词库过滤（如生财工具中的关键词分词工具）                                 |\n" +
                            "| 用户需求挖掘              | 通过搜索引擎相关词爬取时，若关键词相关性低，需重新校验行业域名库或调整排除域名列表。                          | 百度相关词爬取工具、域名相关性校验（如生财工具中的关键词相关搜索工具）                                   |"));
                }});
        template.writeAndClose(new FileOutputStream("D:/word-demo/templateOutput.docx"));
    }

    static MarkdownRenderData getMarkdownRenderData(String str) {
        MarkdownRenderData code = new MarkdownRenderData();
        code.setStyle(MarkdownStyle.newStyle());
        code.setMarkdown(str);
        return code;
    }

    private static TableRenderData getTable() {
//        TableRenderData table = Tables.of().create();
//
//        table.addRow(Rows.of("姓名", "年龄").textFontSize(14).create());
//        table.addRow(Rows.of("张三", "11").textFontSize(14).create());
//        table.addRow(Rows.of("李四", "21").textFontSize(14).create());
//
//        return table;

        return Tables.of(new String[][]{
                new String[]{"00", "01"},
                new String[]{"10", "11"}
        }).border(BorderStyle.DEFAULT).create();
    }

    static PictureRenderData getPic() throws IOException {
        String picBase64 = FileUtils.readFileToString(new File("d:/word-demo/pic.txt"));
        PictureRenderData onePic = Pictures.ofBase64(picBase64, PictureType.BMP).create();

        PictureStyle pictureStyle = new PictureStyle();
        pictureStyle.setAlign(PictureStyle.PictureAlign.CENTER);
        pictureStyle.setWidth(500);
        pictureStyle.setHeight(300);
        onePic.setPictureStyle(pictureStyle);

        return onePic;
    }

    static Object getPersonList() {

        String str = "[\n" +
                "\t[{\n" +
                "\t\t\"name\": \"name\",\n" +
                "\t\t\"type\": \"txt\",\n" +
                "\t\t\"val\": \"张三\"\n" +
                "\t}, {\n" +
                "\t\t\"name\": \"age\",\n" +
                "\t\t\"type\": \"txt\",\n" +
                "\t\t\"val\": \"20\"\n" +
                "\t}],\n" +
                "\t[{\n" +
                "\t\t\"name\": \"name\",\n" +
                "\t\t\"type\": \"txt\",\n" +
                "\t\t\"val\": \"李四\"\n" +
                "\t}, {\n" +
                "\t\t\"name\": \"age\",\n" +
                "\t\t\"type\": \"txt\",\n" +
                "\t\t\"val\": \"30\"\n" +
                "\t}]\n" +
                "]";

        String[][] arr = JSON.parseObject(str, String[][].class);

        List<Map<String, Object>> list = new ArrayList();

        list.add(new HashMap<String, Object>() {{
            put("name", "小王");
            put("age", 3);
        }});
        list.add(new HashMap<String, Object>() {{
            put("name", "<p>Hello <b>world <br /> hello \\n alsdjfsladfasdf</b>! </p> A<sub>eff</sub>");
            put("age", 4);
        }});

        return list;
    }
}

